<?php

/**
 * Create [TIPO]
 * Classe responsavel por cadastros genericos no banco de dados.
 * @copyright (c) year, Romulo B. Bosco 
 */
class Create extends Conn {

    private $Tabela;
    private $Dados;
    private $Result;

    /** @var PDOStatement */
    private $Create;

    /** @var PDO */
    private $Conn;

    /**
     * <b>ExeCreate:</b> Executa um cadastro simplificado no banco de dados utilizando prepared statements.
     * Basta informar o nome da tabela e um array associativo com nome da coluna e valor.
     * 
     * @param STRING $Tabela = INFORME O NOME DA TABELA NO BANCO
     * @param ARRAY $Dados = INFORME UM ARRAY ASSOCIATIVO. (NOME DA COLUNA => VALOR).
     */
    public function ExeCreate($Tabela, array $Dados) {
        $this->Tabela = (string) $Tabela;
        $this->Dados = $Dados;
        
        $this->getSyntax();
        $this->Execute();
    }

    /**
     * 
     * @return FALSE OU O ULTIMO ID INSERIDO NA TABELA CASO O CADASTRO SEJA EXECUTADO COM SUCESSO.
     */
    public function getResult() {
        return $this->Result;
    }

    /**
     * ****************************************
     * *********** PRIVATE METHODS ************
     * ****************************************
     */

    /**
     * OBTEM A CONEXAO COM O PDO E PREPARA A QUERY.
     */
    private function Connect() {
        /**
         * OBTEVE A CONEXAO COM O PDO DA CLASSE CONEXAO
         */
        $this->Conn = parent::getConn();

        /**
         * CRIA A QUERY DENTRO DO ATRIBUTO CREATE.
         */
        $this->Create = $this->Conn->prepare($this->Create);
    }

    /**
     * MONTA A QUERY
     */
    private function getSyntax() {
        /**
         * DA UM IMPLODE NO ARRAY PEGANDO OS CHAVES E OS VALORES DO ARRAY.
         */
        $Fields = implode(', ', array_keys($this->Dados));
        /**
         * DA UM IMPLODE NO ARRAY PEGANDO AS CHAVES E OS VALORES DO ARRAY, MAS ADICIONANDO : ANTES DAS CHAVES.
         */
        $Places = ':' . implode(', :', array_keys($this->Dados));
        
        /**
         * CRIA A INSTRUCAO DE CREATE.
         */
        $this->Create = "INSERT INTO {$this->Tabela}({$Fields}) VALUES ({$Places})";
    }

    /**
     * IRA DAR SUPORTE A EXECUCAO.
     */
    private function Execute() {
        $this->Connect();
        try {
            /**
             * AO PASSAR UM ARRAY ASSOCIATIVO PARA DENTRO DO EXECUTE, O PDO IRA UTILIZAR AS CHAVES COMO BINDS
             */
            $this->Create->execute($this->Dados);
            $this->Result = $this->Conn->lastInsertId();
        } catch (PDOException $ex) {
            $this->Result == null;
            WSErro("<b>Erro ao cadastrar:</b>{$ex->getMessage()}", $ex->getCode());
        }
    }

}
